package com.gl.organigrama.managers
{
	import com.gl.organigrama.events.GLOrganigramaEvent;
	import com.gl.organigrama.vos.Funcionario;
	import com.gl.organigrama.vos.Nodo;
	
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.events.CollectionEvent;

	public class GLOrganigramaManager  extends EventDispatcher
	{
		[Bindable]
		public var funcionarios:ArrayCollection;
		[Bindable]
		public var nodos:ArrayCollection;
		[Bindable]
		public var actividadEstado:String;
		[Bindable]
		public var funcionario:Funcionario;
		[Bindable]
		public var nodoSeleccionado:Nodo;
		[Bindable]
		public var nodoPadre:Nodo;
		[Bindable]
		public var nodosPrimerNivel:Nodo;
		[Bindable]
		public var funcionarioSeleccionado:Funcionario;

		public var dispatcher:IEventDispatcher;
		
		public function setAgregarNodo(value:Nodo, padre:Nodo, nivelUno:Boolean):void
		{
			nodos.addItem(value);
			//relacion del nodo con su padre para que se relacionen los niveles
			value.parent = padre;
			//agregar el nodo al padre
			if( nivelUno )
			{
				padre.hijosNivelUno.addItem(value);
			} else {
				padre.hijosNivelDos.addItem(value);
			}	
			// actualizar el nodo padre, la lista del hijos
			if(value.funcionario != null )
				setAgregarFuncionario(value.funcionario);
			var event:GLOrganigramaEvent = new GLOrganigramaEvent(GLOrganigramaEvent.ACTUALIZAR_NODO);
			event.nodo = padre; 
			dispatcher.dispatchEvent( event );
			
		
		}
		
		public function setActualizarNodo(value:Nodo, padre:Nodo, nivelUno:Boolean):void
		{	
			for each( var nodo:Nodo in nodos  )
			{
				// Solo si se produce movimiento de Algun nodo o cambio del valor Nivel
				if( nodo.id== value.id )
				{
					nodo.cargo = value.cargo;
					nodo.esNodoBase = value.esNodoBase;
					nodo.estilo = value.estilo;
					nodo.funcionario = value.funcionario;
					/*nodo.hijosNivelUno = value.hijosNivelUno;*/
					/*nodo.hijosNivelDos = value.hijosNivelDos;*/
					nodo.sigla = value.sigla;
					if(value.funcionario != null )
						setAgregarFuncionario(value.funcionario);
					nodos.dispatchEvent( new CollectionEvent(CollectionEvent.COLLECTION_CHANGE) ); 
				
					//relacion del nodo con su padre para que se relacionen los niveles
				//	nodo.parent = padre;
					return;
				}
			}
		}
		
		public function setAgregarFuncionario(value:Funcionario):void{
			for each( var funcionario:Funcionario in funcionarios  )
			{
				if( funcionario.id== value.id )
				{
					funcionario.nombre = value.nombre;
					funcionario.apellido = value.apellido;
					funcionario.telefono = value.telefono;
					funcionario.email = value.email;
					funcionarios.dispatchEvent( new CollectionEvent(CollectionEvent.COLLECTION_CHANGE) );
					
					for each( var nodo:Nodo in nodos  )
					{
						if(nodo.funcionario != null){
							if( nodo.funcionario.id == value.id )
							{
								nodo.funcionario = value;
								nodos.dispatchEvent( new CollectionEvent(CollectionEvent.COLLECTION_CHANGE) ); 
							}
						}
					}
						
					return
				}
			}
			funcionarios.addItem(value);
		}
		public function setActividadEstado( state:String ):void
		{
			actividadEstado = state;	
		}
		public function setFuncionarios( value:ArrayCollection ):void
		{
			funcionarios = value;
		}
		public function setNodos( value:ArrayCollection ):void
		{
			nodos = value;
		}
		public function setNodoSeleccionado( value:Nodo ):void
		{
			if(value == null){
			 	nodoSeleccionado = new Nodo()	
			} else {
				nodoSeleccionado = value;
			}
		}
		public function setNodoPadre( value:Nodo ):void
		{
			nodoPadre = value;
		}
		
		public function setFuncionarioSeleccionado(value:Funcionario ):void
		{
			if(value == null){
				funcionarioSeleccionado = new Funcionario();		
			} else {
				funcionarioSeleccionado = value;
			}
		}	
	}
}